package br.fatec.model.entity;

import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OrderBy;

@Entity
public class Fornecedor {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(insertable = false, updatable = false)
	private Integer codigo;

	@Column(length = 200, nullable = false)
	private String nome;

	@Column(length = 20, nullable = true)
	private String cnpj;

	@Column(length = 200, nullable = true)
	private String email;

	@Column(length = 10, nullable = true)
	private String cep;

	@Column(length = 200, nullable = true)
	private String endereco;

	@Column(length = 200, nullable = true)
	private String bairro;

	@Column(length = 200, nullable = true)
	private String numero;

	@Column(length = 2000, nullable = true)
	private String complemento;

	@Column(length = 200, nullable = true)
	private String cidade;

	@Column(length = 2, nullable = true)
	private String uf;

	@Column(length = 2000, nullable = true)
	private String observacoes;

	@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
	@JoinColumn(foreignKey=@ForeignKey(name = "fk_contato_cod", foreignKeyDefinition = "fk_fornecedor_cod"))
	@JoinTable(name = "fornecedor_contato", joinColumns = @JoinColumn(name = "fornecedor_cod", nullable = false), inverseJoinColumns = @JoinColumn(name = "contato_cod", nullable = false))
	@OrderBy("codigo asc")
	private Set<Contato> contatos = new HashSet<Contato>();

	@ManyToOne
	@JoinColumn(nullable = false, updatable = false, foreignKey=@ForeignKey(name = "fk_fornecedor_criadopor"))
	private Usuario criadoPor;

	@GeneratedValue
	@Column(nullable = false, columnDefinition = "timestamp default now()", insertable = false, updatable = false)
	private Timestamp criadoEm;

	@Column(nullable = false, columnDefinition = "boolean default true", insertable = false)
	private Boolean ativo;

	public Integer getCodigo() {
		return codigo;
	}

	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		if (nome != null)
			this.nome = nome.trim();
	}

	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		if (email != null)
			this.email = email.trim();
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		if (endereco != null)
			this.endereco = endereco.trim();
	}

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		if (bairro != null)
			this.bairro = bairro.trim();
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		if (numero != null)
			this.numero = numero.trim();
	}

	public String getComplemento() {
		return complemento;
	}

	public void setComplemento(String complemento) {
		if (complemento != null)
			this.complemento = complemento.trim();
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		if (cidade != null)
			this.cidade = cidade.trim();
	}

	public String getUf() {
		return uf;
	}

	public void setUf(String uf) {
		if (uf != null)
			this.uf = uf.trim();
	}

	public String getObservacoes() {
		return observacoes;
	}

	public void setObservacoes(String observacoes) {
		if (observacoes != null)
			this.observacoes = observacoes.trim();
	}

	public Set<Contato> getContatos() {
		return contatos;
	}

	public void setContatos(Set<Contato> contatos) {
		this.contatos = contatos;
	}

	public Usuario getCriadoPor() {
		return criadoPor;
	}

	public void setCriadoPor(Usuario criadoPor) {
		this.criadoPor = criadoPor;
	}

	public Timestamp getCriadoEm() {
		return criadoEm;
	}

	public void setCriadoEm(Timestamp criadoEm) {
		this.criadoEm = criadoEm;
	}

	public Boolean getAtivo() {
		return ativo;
	}

	public void setAtivo(Boolean ativo) {
		this.ativo = ativo;
	}
}
